#ifndef __CCASA_H
#define __CCASA_H
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<math.h>
#define OK 1
#define TRUE 1
#define FALSE 0
typedef int ElemeType;
typedef int Status;
//定义读写比例值的
extern int Cw_temp;
extern int Cr_temp;
extern int MAX_Cluster;


typedef struct BufNode
{
    ElemeType LPN;//输入的LPN号
    int isD;//脏页标识符
    struct BufNode *pre,*next;
}BufNode,*BufList;

//DLRU簇的索引节点类型
typedef struct LVBNNode
{
    ElemeType LVBN;//存的簇号
    int cluster_size;
    int LPNStart;
    struct LVBNNode *pre,*next;
}LVBNNode,*LVBNList;

//函数定义声明
//首先创建两个队列一个DLRU，一个CLRU
void InitCLRUList(BufList *CHead);
void InitDLRUList(BufList *DHead);
//释放和销毁两个链表队列
Status DestroyCLRUList(BufList *CHead);
Status DestroyDLRUList(BufList *Dhead);
//遍历两链表查看是否存在LPN,存在返回指向该节点的值BufNode类型的指针
BufList FindLPNinCLRU(BufList CHead,ElemeType LPN);
BufList FindLPNinDLRU(BufList Dhead,ElemeType LPN);
//计算两个链表的长度
Status CLRULength(BufList CHead);
Status DLRULength(BufList DHead);
//将新的请求加入到各自的链表中去
Status AddNewToCLRU(BufList CHead,ElemeType LPN,int flag);
Status AddNewToDLRU(BufList DHead,ElemeType LPN,int flag);
//删除各自的LRU位置的项
Status DeleteCLRUend(BufList CHead);
Status DeleteDLRUend(BufList DHead);
//将命中的LPN移动到该队列的MRU位置
Status MoveToMRU(BufList L,BufList HitLPN);
//将CLRU命中的LPN移动到MRU位置
Status MoveCLRUtoDLRU(BufList DHead,BufList HitLPN);
//更新目标队列tau的值
int ComputeTau(BufList DHead,BufList CHead,int *tau,int flag);

//cluster的修改
//创建LVBNList队列
void InitLVBNList(LVBNList *LHead);
//释放LVBNList队列
Status DestroyLVBNList(LVBNList *Head);
//转换LPN变为LVBN,返回值是LVBN
int LPNtoLVBN(ElemeType LPN);
//遍历LVBNList，查看该LVBN是否存在于队列中，如果存在返回LVBNList类型的值
LVBNList FindLVBNinList(LVBNList Head,ElemeType LVBN);
//计算LVBNList的长度
int LVBNListLength(LVBNList Head);
//将新的LVBN加入到LVBNList中去
Status AddNewToLVBN(LVBNList Head,ElemeType LVBN);
//删除LVBN中的LRU位置的项
Status DeleteLVBNend(LVBNList Head);
//将命中的LVBN移动到队列的MRU位置
Status LVBNMovetoMRU(LVBNList Head,LVBNList HitLVBN,int hit_type);
//删除DLRU中LRU的簇
Status DeleteDLRUendCluster(BufList DHead,LVBNList Head);
//将DLRU命中的整个簇移动到MRU位置
Status MoveClusterToMRU(BufList DHead,LVBNList HitLVBN);
//更新所有的LVBNList中的开始位置
void UpdateStartLVBNList(LVBNList Head);
BufList LocateIndexDLRU(BufList DHead,int I);
//利用命中LVBN快速搜索DLRU对应的LPN
BufList QuickSearchDLRU(BufList DHead,LVBNList HitLVBN,ElemeType LPN);

#endif // __CCASA_H
